import Request from 'luch-request';
const http = new Request();
// 挂载到全局 uni.$http 使用
uni.$http = http;

export const HttpRequest = (vm) => {
	// 初始化请求配置
	uni.$http.setConfig((config) => {
		// 开发环境 apiURL
		if (process.env.NODE_ENV === 'development') {
			// config.baseURL = 'https://productionDomain/api'; /* 临时切换正式服 */
			config.baseURL = 'http://localhost:8000/api'; /* 测试服/体验版 根域名 */
		}
		// 生产环境 apiURL
		if (process.env.NODE_ENV === 'production') {
			config.baseURL = 'https://productionDomain/api'; /* 正式服 根域名 */
		}
		/* config 为默认全局配置*/
		config.custom = {
			// 请求时加载提示
			loading: true,
			// 需要登录
			auth: false,
			// catch时 及 
			catch: true,	// 是否需要 catch
			errToast: false, // 是否弹 toast 提示
		}
		return config
	})

	// 请求拦截
	uni.$http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		config.data = config.data || {}
		// 根据custom参数中配置的是否需要token，添加对应的请求头
		if (config?.custom?.auth) {
			// Vuex中获取 vm.$store.state 变量含TOKEN，或其他存储的 state
			config.header.token = vm.$store.state.userInfo.token
		}
		/* 请求加载提示 */
		if (config?.custom?.loading) {
			uni.showLoading({
				title: '加载中...',
				mask: true
			})
		}
		return config
	}, config => { // 可使用async await 做异步操作
		return Promise.reject(config)
	})

	// 响应拦截
	uni.$http.interceptors.response.use((response) => {
		/* 对响应成功做点什么 可使用async await 做异步操作*/
		const data = response.data
		const statusCode = response.statusCode;
		// 自定义全局配置
		const custom = response.config?.custom;
		
		if (custom?.loading) { uni.hideLoading() }

		// 获取HTTP响应码，以及data.code
		if (statusCode !== 200 || data.code !== 1) {
			// 如果没有显式定义custom的errToast参数为false的话，默认对报错进行errToast弹出提示
			if (custom?.errToast !== false) {
				uni.showToast({
					title: data.msg,
					mask: true,
					icon: 'none',
					duration: 3000
				})
			}

			// 如果需要catch返回，则进行reject
			if (custom?.catch) {
				return Promise.reject(data)
			} else {
				// 否则返回一个pending中的promise，请求不会进入catch中
				return new Promise(() => {})
			}
		}
		return data.data === undefined ? {} : data.data
	}, (response) => {
		// 自定义全局配置
		const custom = response.config?.custom;
		if (custom?.loading) { uni.hideLoading() }
		// 对响应错误做点什么 （statusCode !== 200）
		return Promise.reject(response)
	})
}